package com.jy.adscm.core.repository.config;


import com.alibaba.druid.pool.xa.DruidXADataSource;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
import com.jy.adscm.core.repository.properties.DataSourceMySqlProperties;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;


/**
 *   ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 * @author yyy
 * @ClassName MySqlDataBaseConfig
 * @Description mysql 数据源的配置类
 * @date 2018/7/27 18:42
 */
@Configuration
@PropertySource(value = {"classpath:db.properties"})
@MapperScan(basePackages = {"com.jy.adscm.**.dao","com.jy.adscm.**.mapper"}, sqlSessionTemplateRef = "mySql_sqlSessionTemplate")
public class MySqlDataBaseConfig{

    Logger logger = LoggerFactory.getLogger(getClass());

    @Value("${mybatis.mapper-mysql-locations}")
    String mapperLocations;
    @Value("${mybatis.typeAliasesPackage}")
    String typeAliasesPackage;


    @Primary
    @Bean(name = "mySqlBaseDataSource")
    public DataSource mySqlBaseDataSource(DataSourceMySqlProperties dataSourceMySqlProperties){
        logger.info("初始化MySQL的Druid数据源 开始...");
        DruidXADataSource dataSource = new DruidXADataSource();
        BeanUtils.copyProperties(dataSourceMySqlProperties,dataSource);
        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(dataSource);//autoReconnect=true
        xaDataSource.setUniqueResourceName("mySqlBaseDataSource");
        logger.info("初始化MySQL的Druid数据源 完成..."+ xaDataSource);
        return xaDataSource;
    }


    @Bean(name = "mySql_sqlSessionFactory")
    public SqlSessionFactory mySql_sqlSessionFactory(@Qualifier("mySqlBaseDataSource") DataSource mySqlBaseDataSource)
            throws Exception {
        logger.info("初始化MySQL的SqlSessionFactory 开始...");
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
//        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(mySqlBaseDataSource);
        bean.setTypeAliasesPackage(typeAliasesPackage);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        return bean.getObject();
    }

    @Bean(name = "mySql_sqlSessionTemplate")
    public SqlSessionTemplate mySql_sqlSessionTemplate(@Qualifier("mySql_sqlSessionFactory") SqlSessionFactory mySql_sqlSessionFactory) throws Exception {
        logger.info("初始化MySQL的SqlSessionTemplate 开始...");
        return new SqlSessionTemplate(mySql_sqlSessionFactory);
    }


}














//
///**
// * @author yyy
// * @ClassName MySqlDataBaseConfig
// * @Description mysql 数据源的配置类
// * @date 2018/7/27 18:42
// */
//@Configuration
//@PropertySource(value = {"classpath:db.properties"})
//@MapperScan(basePackages = {"com.jy.adscm.core.dao.mysql"},sqlSessionTemplateRef = "mySql_sqlSessionTemplate")
//public class MySqlDataBaseConfig {
//
//    Logger logger = LoggerFactory.getLogger(getClass());
//
//    @Value("${mybatis.mapper-mysql-locations}")
//    String mapperLocations;
//
//
//    @Qualifier("mySqlBaseDataSource")
//    @ConfigurationProperties(prefix = "spring.datasource.mysql")
//    @Bean(name = "mySqlBaseDataSource")
//    public DataSource mySqlBaseDataSource() throws SQLException {
//        DruidXADataSource dataSource = new DruidXADataSource();
////        DruidDataSource dataSource = new DruidDataSource();
//        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//        dataSource.setUrl("jdbc:mysql://localhost:3306/adscm?useUnicode=true&characterEncoding=utf8");
//        dataSource.setUsername("root");
//        dataSource.setPassword("123456");
//        //配置最大连接
//        dataSource.setMaxActive(300);
//        //配置初始连接
//        dataSource.setInitialSize(20);
//        //配置最小连接
//        dataSource.setMinIdle(10);
//        //连接等待超时时间
//        dataSource.setMaxWait(60000);
//        //间隔多久进行检测,关闭空闲连接
//        dataSource.setTimeBetweenEvictionRunsMillis(60000);
//        //一个连接最小生存时间
//        dataSource.setMinEvictableIdleTimeMillis(300000);
//        //连接等待超时时间 单位为毫秒 缺省启用公平锁，
//        //并发效率会有所下降， 如果需要可以通过配置useUnfairLock属性为true使用非公平锁
//        dataSource.setUseUnfairLock(true);
//        //用来检测是否有效的sql
//        dataSource.setValidationQuery("select 'x'");
//        dataSource.setTestWhileIdle(true);
//        //申请连接时执行validationQuery检测连接是否有效，配置为true会降低性能
//        dataSource.setTestOnBorrow(false);
//        //归还连接时执行validationQuery检测连接是否有效，配置为true会降低性能
//        dataSource.setTestOnReturn(false);
//        //打开PSCache,并指定每个连接的PSCache大小启用poolPreparedStatements后，
//        //PreparedStatements 和CallableStatements 都会被缓存起来复用，
//        //即相同逻辑的SQL可以复用一个游标，这样可以减少创建游标的数量。
//        dataSource.setPoolPreparedStatements(true);
//        dataSource.setMaxOpenPreparedStatements(20);
//        //配置sql监控的filter
//        dataSource.setFilters("stat,wall,log4j");
//        try {
//            dataSource.init();
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
//        xaDataSource.setXaDataSource(dataSource);
//        xaDataSource.setUniqueResourceName("mySqlBaseDataSource");
//		/*xaDataSource.setMinPoolSize(10);
//		xaDataSource.setMaxPoolSize(300);
//		xaDataSource.setMaxLifetime(20000);
//		xaDataSource.setBorrowConnectionTimeout(30);
//		xaDataSource.setLoginTimeout(30);
//		xaDataSource.setMaintenanceInterval(60);
//		xaDataSource.setMaxIdleTime(60);
//		xaDataSource.setTestQuery("select 'x'");*/
//        return xaDataSource;
//
//    }
//
//
//
//
//
//
//
//
//
//
//
//
//
////    /**
////     * 数据源1：mysql数据源，默认
////     * @return
////     */
////    @Bean(name = "mySqlBaseDataSource")
////    @Qualifier("mySqlBaseDataSource")
////    @ConfigurationProperties(prefix = "spring.datasource.mysql")
////    @Primary        //指定 为默认的访问的数据源
////    public DataSource mySqlBaseDataSource(){
////
////        logger.info("初始化MySQL的Druid数据源 开始...");
////
////        DataSource dataSource = new DruidXADataSource();
//////        DataSource dataSource = DruidDataSourceBuilder.create().build();
////        logger.info("初始化MySQL的Druid数据源 成功 ... "+dataSource);
////
////        return dataSource;
////    }
//
//
//    @Bean(name = "mySql_sqlSessionFactory")
//    @ConfigurationProperties(prefix = "mybatis")
//    @Primary
//    public SqlSessionFactory mySql_sqlSessionFactory(@Qualifier("mySqlBaseDataSource")DataSource mySqlBaseDataSource) throws Exception {
//        logger.info("初始化MySQL的 SqlSessionFactory ...");
//        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
//        // bean.setConfiguration(getConfiguration());
//        bean.setDataSource(mySqlBaseDataSource);
//        bean.setMapperLocations( new PathMatchingResourcePatternResolver().getResources(mapperLocations));
//        return bean.getObject();
//    }
//
//
//    @Bean(name = "mySql_sqlSessionTemplate")
//    @Primary
//    public SqlSessionTemplate mySql_sqlSessionTemplate(@Qualifier("mySql_sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
//        logger.info("初始化MySQL的 sqlSessionTemplate ...");
//        return new SqlSessionTemplate(sqlSessionFactory);
//    }
//
//
////    @Bean(name = "mySqlTransactionManager")
////    @Primary
////    public DataSourceTransactionManager mySql_TransactionManager(@Qualifier("mySqlBaseDataSource") DataSource mySqlBaseDataSource) {
////        logger.info("初始化MySQL的 TransactionManager ...");
////        return new DataSourceTransactionManager(mySqlBaseDataSource);
////    }
//
//
//    @Bean //这个Bean和它以下的Bean都是为了开启druid自带的一个监控界面
//    public ServletRegistrationBean druidServlet() {
//        ServletRegistrationBean reg = new ServletRegistrationBean();
//        reg.setServlet(new StatViewServlet());
//        reg.addUrlMappings("/druid/*");
//        reg.addInitParameter("allow", ""); // 白名单
//        return reg;
//    }
//    @Bean
//    public FilterRegistrationBean filterRegistrationBean() {
//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
//        filterRegistrationBean.setFilter(new WebStatFilter());
//        filterRegistrationBean.addUrlPatterns("/*");
//        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
//        filterRegistrationBean.addInitParameter("profileEnable", "true");
//        filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
//        filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
//        filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");
//        return filterRegistrationBean;
//    }
//
//
//
//}
